package com.sky.service;

import com.sky.dto.*;
import com.sky.entity.Orders;
import com.sky.result.PageResult;
import com.sky.vo.*;

import java.io.IOException;
import java.net.URISyntaxException;
import java.time.LocalDate;
import java.util.List;

public interface OrderService {

    /**
     * @param ordersSubmitDTO:
     * return OrderSubmitVO
     * {@link OrderSubmitVO}
     * @author fenglai
     * @date 2023/12/4 21:00
     * @description 用户下单功能
     */
    OrderSubmitVO submit(OrdersSubmitDTO ordersSubmitDTO) throws URISyntaxException, IOException;


    /**
     * 订单支付
     *
     * @param ordersPaymentDTO
     * @return
     */
    OrderPaymentVO payment(OrdersPaymentDTO ordersPaymentDTO) throws Exception;

    /**
     * 支付成功，修改订单状态
     *
     * @param outTradeNo
     */
    void paySuccess(String outTradeNo);

    /**
     * @param id:
     * return Orders
     * {@link Orders}
     * @author fenglai
     * @date 2023/12/4 21:00
     * @description 查询订单功能
     */
    OrderVO selectOrder(Long id);

    /**
     * @param ordersPageQueryDTO:
     * return PageResult
     * {@link PageResult}
     * @author fenglai
     * @date 2023/12/4 21:00
     * @description 条件查询订单功能
     */
    PageResult pageQueryOrders(OrdersPageQueryDTO ordersPageQueryDTO);


    /**
     * @param id:
     * return OrderVO
     * {@link OrderVO}
     * @author fenglai
     * @date 2023/12/4 21:00
     * @description 查询订单详情功能
     */
    OrderVO selectOrderDetail(Long id);


    /**
     * @param :
     * return OrderStatisticsVO
     * {@link OrderStatisticsVO}
     * @author fenglai
     * @date 2023/12/4 21:01
     * @description 统计订单状态功能
     */
    OrderStatisticsVO countOrderStatusNumber();


    /**
     * @param ordersCancelDTO:
     * return void
     * @author fenglai
     * @date 2023/12/4 21:01
     * @description 取消订单的功能
     */
    void updateOrder(OrdersCancelDTO ordersCancelDTO);


    /**
     * @param id:
     * return void
     * @author fenglai
     * @date 2023/12/4 21:02
     * @description 派送订单的功能
     */
    void deliveryOrder(Long id);

    /**
     * @param confirmDTO:
     * return void
     * @author fenglai
     * @date 2023/12/4 21:02
     * @description 接单功能
     */

    void comfirmOrder(OrdersConfirmDTO confirmDTO);

    /**
     * @param ordersRejectionDTO:
     * return void
     * @author fenglai
     * @date 2023/12/4 21:03
     * @description 拒单功能
     */

    void rejection(OrdersRejectionDTO ordersRejectionDTO);


    /**
     * @param id:
     * return void
     * @author fenglai
     * @date 2023/12/4 21:03
     * @description 完成订单的功能
     */

    void completeOrder(Long id);

    /**
     * @param ordersPageQueryDTO:
     * return PageResult
     * {@link PageResult}
     * @author fenglai
     * @date 2023/12/4 21:15
     * @description 查询历史订单功能
     */
    PageResult historyOrders(OrdersPageQueryDTO ordersPageQueryDTO);

    /**
     * @param id:
     * return void
     * @author fenglai
     * @date 2023/12/4 21:28
     * @description 再来一单
     */
    void repetitionOrder(Long id);

    void cancelOrder(Long id);

    void reminderOrder(Long id);


    OrderReportVO countOrders(OrdersStatisticsDTO dto);

    UserReportVO userStatistics(OrdersStatisticsDTO dto);

    TurnoverReportVO turnoverStatistics(OrdersStatisticsDTO dto);

    SalesTop10ReportVO getTop10(OrdersStatisticsDTO ordersStatisticsDTO);
}
